home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / PROG_TOO / C027B.ZIP / TOP / IO.C < prev    next >
Text File  |  1990-03-30  |  3KB  |  132 lines

  1. /* Copyright (c) 1988 by Sozobon, Limited.  Author: Tony Andrews
  2.  *
  3.  * Permission is granted to anyone to use this software for any purpose
  4.  * on any computer system, and to redistribute it freely, with the
  5.  * following restrictions:
  6.  * 1) No charge may be made other than reasonable charges for reproduction.
  7.  * 2) Modified versions must be clearly marked as such.
  8.  * 3) The authors are not responsible for any harmful consequences
  9.  *    of using this software, even if they result from defects in it.
  10.  */
  11. #include "top.h"
  12.  
  13. /*
  14.  * Low-level i/o routines.
  15.  */
  16.  
  17. /*
  18.  * mode tells what kind of stuff we're reading at the moment.
  19.  */
  20. static    int    mode;
  21.  
  22. #define    BSS    0
  23. #define    DATA    1
  24. #define    TEXT    2
  25.  
  26. static    char    *mnames[] = {
  27.     ".bss",
  28.     ".data",
  29.     ".text"
  30. };
  31.  
  32. /*
  33.  * Tokens from the current line...
  34.  */
  35. char    *t_line;        /* the entire line */
  36. char    *t_lab;            /* label, if any */
  37. char    *t_op;            /* opcode */
  38. char    *t_arg;            /* arguments */
  39.  
  40. #define    ISWHITE(c)    ((c) == '\t' || (c) == ' ' || (c) == '\n')
  41.  
  42. #define    LSIZE    2048    /* max. size of an input line */
  43.  
  44. /*
  45.  * readline() - read the next line from the file
  46.  *
  47.  * readline passes data and bss through to the output, only returning
  48.  * when a line of text has been read. Returns FALSE on end of file.
  49.  */
  50. bool
  51. readline()
  52. {
  53.     char    *fgets();
  54.     static    void    tokenize();
  55.     static    char    buf[LSIZE];
  56.  
  57.     /*
  58.      * Keep looping until we get a line of text
  59.      */
  60.     for (;;) {
  61.         if (fgets(buf, LSIZE, ifp) == NULL)
  62.             return FALSE;
  63.     
  64.         t_line = buf;
  65.     
  66.         /*
  67.          * Find out if the mode is changing.
  68.          */
  69.         tokenize(buf);
  70.     
  71.         if (t_op[0] == '.') {        /* is it a pseudo-op? */
  72.             if (strcmp(t_op, mnames[BSS]) == 0)
  73.                 mode = BSS;
  74.             else if (strcmp(t_op, mnames[DATA]) == 0)
  75.                 mode = DATA;
  76.             else if (strcmp(t_op, mnames[TEXT]) == 0) {
  77.                 mode = TEXT;
  78.                 continue;
  79.             }
  80.         }
  81.         if (mode == TEXT)
  82.             return TRUE;
  83.         else
  84.             fputs(buf, ofp);
  85.     }
  86. }
  87.  
  88. static void
  89. tokenize(s)
  90. register char    *s;
  91. {
  92.     static    char    label[LSIZE], opcode[LSIZE], args[LSIZE];
  93.     register int    i;
  94.  
  95.     /*
  96.      * Grab the label, if any
  97.      */
  98.     i = 0;
  99.     while (*s && !ISWHITE(*s) && *s != ':')
  100.         label[i++] = *s++;
  101.     label[i] = '\0';
  102.  
  103.     if (*s == ':')
  104.         s++;
  105.  
  106.     while (ISWHITE(*s))
  107.         s++;
  108.  
  109.     /*
  110.      * Grab the opcode
  111.      */
  112.     i = 0;
  113.     while (*s && !ISWHITE(*s))
  114.         opcode[i++] = *s++;
  115.     opcode[i] = '\0';
  116.  
  117.     while (ISWHITE(*s))
  118.         s++;
  119.  
  120.     /*
  121.      * Grab the arguments
  122.      */
  123.     i = 0;
  124.     while (*s && !ISWHITE(*s))
  125.         args[i++] = *s++;
  126.     args[i] = '\0';
  127.  
  128.     t_lab = label;
  129.     t_op = opcode;
  130.     t_arg = args;
  131. }
  132.